//class2_1 通过传值传递数据
#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>
//__global__  __device__ ,__host__ 三个限定关键字
//第一个表示主机上调用设备
//第二个表示设备调用设备函数
//第三个表示主机调用主机函数
//默认情况会生成两个版本 主机和设备各一个版本
__global__ void gpuAdd(int d_a, int d_b, int* d_c)
{
    *d_c = d_a + d_b;
}

int main(void)
{
    //定义变量 加上h_表示主机变量
    int h_c;
    //定义返回指针 加上d_ 表示设备变量
    int *d_c;
    //为d_c开拓显卡内存 cudaMalloc类似于Memcpy 分配内存给指针
    cudaMalloc((void**)&d_c, sizeof(int));
    //执行加法 返回必须指向设备变量 如果指向主机内存会崩溃
    //前面表示块 后面表示线程数 实际线程数为前面两个值的乘积 后面线程数受显卡硬件限制
    gpuAdd << <1, 1 >> > (1, 4, d_c);
    //内存拷贝 将内存区域复制到主机或设备上的区域
    //第一个参数是目标 第二个参数是源指针 第三个参数是数据大小 第四个参数模式 主机到设备 , 设备到设备 , 主机到主机 设备到主机
    cudaMemcpy(&h_c, d_c, sizeof(int), cudaMemcpyDeviceToHost);
    //主机打印输出
    printf("1+4= %d\n", h_c);
    //释放显卡内存 
    cudaFree(d_c);
    return 0;
}